package clasificaciones;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import utils.defines;
import conector.mysql;
import dao.partidosDao;

public class generador extends mysql{

	static dao.clasificacionesDao clasificacionesDao = new dao.clasificacionesDao();
	static dao.competicionesDao competicionesDao = new dao.competicionesDao();
	static dao.partidosDao partidosDao = new dao.partidosDao();
	static utils.clasificacionesUtils clasificacionesUtils = new utils.clasificacionesUtils();
	
	public void crearTabla() throws IOException, SQLException {
		clasificacionesDao.crearTablaClasificaciones();
	}

	public void generarClasificaciones() throws SQLException{
		generarClasificacion(defines.PRIMERA_DIVISION,defines.TEMPORADA_ACTUAL);
		generarClasificacion(defines.SEGUNDA_DIVISION,defines.TEMPORADA_ACTUAL);
		generarClasificacion(defines.SEGUNDA_DIVISION_B,defines.TEMPORADA_ACTUAL);
		generarClasificacion(defines.TERCERA_DIVISION,defines.TEMPORADA_ACTUAL);
		generarClasificacion(defines.DIVISIONES_REGIONALES,defines.TEMPORADA_ACTUAL);
	}
	
	public void generarClasificacion(int categoria,int temporada) throws SQLException{
		ResultSet competiciones = competicionesDao.getCompeticionesPorCategoria(categoria); //buscamos competiciones por categoria
		
		int totalClasificaciones = clasificacionesDao.totalClasificaciones();
		
		while(competiciones.next()){
			int competicion = competiciones.getInt("id_competicion");
			ResultSet partidos = partidosDao.getPartidosPorCategoriaCompeticion(categoria,competicion,temporada); // buscamos todos los partidos de cada competicion
			while(partidos.next()){ 
				insertarClasificacionEquipoLocal(partidos);
				insertarClasificacionEquipoVisitante(partidos);
				String tantoXCiento = contarPartidosInsertados(totalClasificaciones);
				System.out.print(tantoXCiento+"%  -- Total Clasificaciones realizadas --->"+totalClasificaciones+"\n");
				totalClasificaciones++;
			}
		}		
	}
	
	public String contarPartidosInsertados(int numeroClasificacionInsertado){
		float totalPartidos = 145920;
		float  resultado = (numeroClasificacionInsertado/totalPartidos)*100;
		return String.format("%.1f",resultado);
		
	}
	
	
	private void insertarClasificacionEquipoLocal(ResultSet partidos) throws SQLException{
		Map<String, Integer> clasificacion = new HashMap<String, Integer>();
		
		int equipo = partidos.getInt("id_equipo_local");
		int temporada = partidos.getInt("temporada");
		int id_categoria = partidos.getInt("id_categoria");
		int id_competicion = partidos.getInt("id_competicion");
		int jornada = partidos.getInt("jornada");
		
		
		clasificacion.put("id_equipo",equipo); 
		clasificacion.put("temporada",temporada);
		clasificacion.put("id_categoria",id_categoria);
		clasificacion.put("id_competicion",id_competicion);
		clasificacion.put("jornada",jornada);
		clasificacion.put("goles_favor",clasificacionesUtils.getGolesFavor(equipo,partidos)+partidos.getInt("marcador_l")); // SUMATORIO GOLES FAVOR
		clasificacion.put("goles_contra",clasificacionesUtils.getGolesContra(equipo,partidos)+partidos.getInt("marcador_v")); // SUMATORIO GOLES CONTRA
		clasificacion.put("posicion",0); // NO SUMAMOS POSICION
		determinarResultado(clasificacion,equipo,partidos);

		//System.out.print(clasificacion);
		clasificacionesDao.generarClasificacionEquipo(clasificacion);
	}
	
	
	
	
	

	private void insertarClasificacionEquipoVisitante(ResultSet partidos) throws SQLException{
		Map<String, Integer> clasificacion = new HashMap<String, Integer>();
		
		int equipo = partidos.getInt("id_equipo_visitante");
		int temporada = partidos.getInt("temporada");
		int id_categoria = partidos.getInt("id_categoria");
		int id_competicion = partidos.getInt("id_competicion");
		int jornada = partidos.getInt("jornada");
		
		
		clasificacion.put("id_equipo",equipo); 
		clasificacion.put("temporada",temporada);
		clasificacion.put("id_categoria",id_categoria);
		clasificacion.put("id_competicion",id_competicion);
		clasificacion.put("jornada",jornada);
		clasificacion.put("goles_favor",clasificacionesUtils.getGolesFavor(equipo,partidos)+partidos.getInt("marcador_v")); // SUMATORIO GOLES FAVOR
		clasificacion.put("goles_contra",clasificacionesUtils.getGolesContra(equipo,partidos)+partidos.getInt("marcador_l")); // SUMATORIO GOLES CONTRA
		clasificacion.put("posicion",0); // NO SUMAMOS POSICION
		determinarResultado(clasificacion,equipo,partidos);

		//System.out.print(clasificacion);
		clasificacionesDao.generarClasificacionEquipo(clasificacion);
	}
	

	
	public Map<String, Integer> determinarResultado (Map<String, Integer> clasificacion, int equipo, ResultSet partidos) throws SQLException{
		int marcador_l = partidos.getInt("marcador_l");
		int marcador_v = partidos.getInt("marcador_v");
		int resultado = 0;
		if(marcador_l>marcador_v){
			resultado = 1;
		}
		if(marcador_l==marcador_v){ //EMPATE
			resultado =  0;
		}
		if(marcador_l<marcador_v){ // GANA EQUIPO VISITANTE
			resultado = 2;
		}
		
		int equipo_local = partidos.getInt("id_equipo_local");
		int equipo_visitante = partidos.getInt("id_equipo_visitante");

		 // pg ->SUMATORIO PARTIDOS GANADOS
		 // pe -> SUMATORIO PARTIDOS EMPATADOS
		 // pp -> SUMATORIO PARTIDOS PERDIDOS
		
		if(resultado == 1 ){ //GANA EQUIPO LOCAL, devolvemos array al equipo visitante como partido perdido y al local como partido ganado
			if(equipo_local==equipo){
				clasificacion.put("pg",clasificacionesUtils.getPartidosGanados(equipo,partidos)+1);
				clasificacion.put("pe",clasificacionesUtils.getPartidosEmpatados(equipo, partidos));
				clasificacion.put("pp",clasificacionesUtils.getPartidosPerdidos(equipo, partidos));
				clasificacion.put("puntos",clasificacionesUtils.getPuntos(equipo,partidos)+3);// SUMATORIO PUNTOS
			}
			if(equipo_visitante==equipo){
				clasificacion.put("pg",clasificacionesUtils.getPartidosGanados(equipo,partidos));
				clasificacion.put("pe",clasificacionesUtils.getPartidosEmpatados(equipo,partidos));
				clasificacion.put("pp",clasificacionesUtils.getPartidosPerdidos(equipo,partidos)+1);
				clasificacion.put("puntos",clasificacionesUtils.getPuntos(equipo,partidos));// SUMATORIO PUNTOS
			}
		}
		
		if(resultado == 0){ //EMPATE
			clasificacion.put("pg",clasificacionesUtils.getPartidosGanados(equipo,partidos));
			clasificacion.put("pe",clasificacionesUtils.getPartidosEmpatados(equipo, partidos)+1);	
			clasificacion.put("pp",clasificacionesUtils.getPartidosPerdidos(equipo,partidos));
			clasificacion.put("puntos",clasificacionesUtils.getPuntos(equipo,partidos)+1);// SUMATORIO PUNTOS
		}
		
		if(resultado == 2 ){ //GANA EQUIPO VISITANTE, devolvemos array al equipo local como partido perdido y visitante como partido ganado
			if(equipo_visitante==equipo){
				clasificacion.put("pg",clasificacionesUtils.getPartidosGanados(equipo,partidos)+1);
				clasificacion.put("pe",clasificacionesUtils.getPartidosEmpatados(equipo, partidos));
				clasificacion.put("pp",clasificacionesUtils.getPartidosPerdidos(equipo, partidos));
				clasificacion.put("puntos",clasificacionesUtils.getPuntos(equipo,partidos)+3);// SUMATORIO PUNTOS
			}
			if(equipo_local==equipo){
				clasificacion.put("pg",clasificacionesUtils.getPartidosGanados(equipo,partidos));
				clasificacion.put("pe",clasificacionesUtils.getPartidosEmpatados(equipo, partidos));
				clasificacion.put("pp",clasificacionesUtils.getPartidosPerdidos(equipo, partidos)+1);
				clasificacion.put("puntos",clasificacionesUtils.getPuntos(equipo,partidos));// SUMATORIO PUNTOS
			}
		}
		return clasificacion;
	}
	
}
